#!/bin/bash

# 账号密码管理器 - 自动部署脚本
# 使用方法：./deploy.sh [dev|prod]

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查命令是否存在
check_command() {
    if ! command -v $1 &> /dev/null; then
        log_error "$1 命令未找到，请先安装"
        exit 1
    fi
}

# 检查环境
check_environment() {
    log_info "检查部署环境..."

    # 检查必要命令
    check_command "php"
    check_command "composer"
    check_command "node"
    check_command "npm"

    # 检查PHP版本
    PHP_VERSION=$(php -r "echo PHP_VERSION;")
    if [[ $(echo "$PHP_VERSION 8.0" | awk '{print ($1 >= $2)}') == 0 ]]; then
        log_error "PHP版本需要 >= 8.0，当前版本：$PHP_VERSION"
        exit 1
    fi

    # 检查Node版本
    NODE_VERSION=$(node -v | sed 's/v//')
    if [[ $(echo "$NODE_VERSION 16.0" | awk '{print ($1 >= $2)}') == 0 ]]; then
        log_error "Node.js版本需要 >= 16.0，当前版本：$NODE_VERSION"
        exit 1
    fi

    log_success "环境检查通过"
}

# 后端部署
deploy_backend() {
    log_info "开始部署后端..."

    cd backend

    # 安装依赖
    log_info "安装PHP依赖..."
    composer install --no-dev --optimize-autoloader

    # 检查配置文件
    if [ ! -f ".env" ]; then
        if [ -f ".env.example" ]; then
            cp .env.example .env
            log_warning "已创建.env文件，请修改其中的配置"
        else
            log_error "未找到.env.example文件"
            exit 1
        fi
    fi

    # 设置权限
    chmod -R 755 runtime/

    # 检查数据库连接
    log_info "检查数据库连接..."
    php -r "
        try {
            \$config = include 'config/database.php';
            \$dsn = \$config['default']['type'] . ':host=' . \$config['default']['hostname'] . ';dbname=' . \$config['default']['database'];
            \$pdo = new PDO(\$dsn, \$config['default']['username'], \$config['default']['password']);
            echo 'Database connection successful' . PHP_EOL;
        } catch (Exception \$e) {
            echo 'Database connection failed: ' . \$e->getMessage() . PHP_EOL;
            exit(1);
        }
    " || (log_error "数据库连接失败，请检查配置"; exit 1)

    cd ..
    log_success "后端部署完成"
}

# 前端部署
deploy_frontend() {
    log_info "开始部署前端..."

    cd frontend

    # 安装依赖
    log_info "安装前端依赖..."
    npm install

    # 构建项目
    if [ "$1" = "prod" ]; then
        log_info "构建生产版本..."
        npm run build
        log_success "前端构建完成，文件位于 dist/ 目录"
    else
        log_info "开发环境，跳过构建步骤"
    fi

    cd ..
    log_success "前端部署完成"
}

# 数据库初始化
init_database() {
    log_info "初始化数据库..."

    # 检查数据库是否已存在数据
    TABLES_COUNT=$(mysql -u root -p -e "USE accountmanage; SHOW TABLES;" 2>/dev/null | wc -l || echo "0")

    if [ "$TABLES_COUNT" -eq "0" ]; then
        log_info "导入数据库结构..."
        mysql -u root -p < backend/database/migrations/create_database.sql

        if [ -f "backend/insert_categories.sql" ]; then
            log_info "导入系统分类数据..."
            mysql -u root -p accountmanage < backend/insert_categories.sql
        fi

        log_success "数据库初始化完成"
    else
        log_info "数据库已存在数据，跳过初始化"
    fi
}

# 启动服务
start_services() {
    if [ "$1" = "prod" ]; then
        log_info "生产环境请手动配置Web服务器"
        log_info "Nginx配置示例在README.md中"
    else
        log_info "启动开发服务..."

        # 启动后端
        cd backend
        nohup php think run &
        BACKEND_PID=$!
        log_success "后端服务已启动 (PID: $BACKEND_PID)"
        cd ..

        # 启动前端
        cd frontend
        nohup npm run dev &
        FRONTEND_PID=$!
        log_success "前端服务已启动 (PID: $FRONTEND_PID)"
        cd ..

        # 保存PID
        echo $BACKEND_PID > .backend.pid
        echo $FRONTEND_PID > .frontend.pid

        log_success "服务启动完成！"
        log_info "前端地址: http://localhost:3000"
        log_info "后端地址: http://localhost:8000"
        log_info "停止服务: ./deploy.sh stop"
    fi
}

# 停止服务
stop_services() {
    log_info "停止开发服务..."

    if [ -f ".backend.pid" ]; then
        BACKEND_PID=$(cat .backend.pid)
        kill $BACKEND_PID 2>/dev/null || true
        rm .backend.pid
        log_success "后端服务已停止"
    fi

    if [ -f ".frontend.pid" ]; then
        FRONTEND_PID=$(cat .frontend.pid)
        kill $FRONTEND_PID 2>/dev/null || true
        rm .frontend.pid
        log_success "前端服务已停止"
    fi
}

# 清理缓存
clean_cache() {
    log_info "清理缓存..."

    # 清理后端缓存
    if [ -d "backend/runtime/cache" ]; then
        rm -rf backend/runtime/cache/*
        log_success "后端缓存已清理"
    fi

    # 清理前端构建缓存
    if [ -d "frontend/dist" ]; then
        rm -rf frontend/dist
        log_success "前端构建缓存已清理"
    fi

    if [ -d "frontend/node_modules/.cache" ]; then
        rm -rf frontend/node_modules/.cache
        log_success "前端依赖缓存已清理"
    fi
}

# 显示帮助信息
show_help() {
    echo "账号密码管理器 - 部署脚本"
    echo ""
    echo "使用方法:"
    echo "  ./deploy.sh [command]"
    echo ""
    echo "命令:"
    echo "  dev           部署开发环境（默认）"
    echo "  prod          部署生产环境"
    echo "  stop          停止开发服务"
    echo "  clean         清理缓存"
    echo "  init-db       初始化数据库"
    echo "  help          显示帮助信息"
    echo ""
    echo "示例:"
    echo "  ./deploy.sh dev      # 部署开发环境"
    echo "  ./deploy.sh prod     # 部署生产环境"
    echo "  ./deploy.sh stop     # 停止服务"
}

# 主函数
main() {
    case ${1:-dev} in
        "dev")
            check_environment
            deploy_backend
            deploy_frontend "dev"
            start_services "dev"
            ;;
        "prod")
            check_environment
            deploy_backend
            deploy_frontend "prod"
            start_services "prod"
            ;;
        "stop")
            stop_services
            ;;
        "clean")
            clean_cache
            ;;
        "init-db")
            init_database
            ;;
        "help"|"-h"|"--help")
            show_help
            ;;
        *)
            log_error "未知命令: $1"
            show_help
            exit 1
            ;;
    esac
}

# 脚本入口
main "$@"